package com.pkk.penguin.frame.know.java.interview.year2021.atguigu_20210226.lru;

import java.util.LinkedHashMap;
import java.util.Map.Entry;

/**
 * lru算法的简单实现方式之一
 *
 * @author peikunkun
 * @version V1.0
 * @date 2021-03-15 09:36
 **/
public class LruSimpleOne<K, V> extends LinkedHashMap<K, V> {

  private static final long serialVersionUID = -5151182920970436936L;


  /**
   * 最大容量
   */
  private int capacity;


  public LruSimpleOne(int capacity) {
    super(capacity, 0.75f, true);
    this.capacity = capacity;
  }


  public V add(K key, V value) {
    return this.put(key, value);
  }


  /**
   * 如果此映射应删除其最旧的条目，则返回true 。 在将新条目插入到映射后，由put和putAll调用此方法。 每次添加新条目时，它为实现者提供了删除最旧条目的机会。
   * 如果该映射表示一个缓存，这将很有用：它允许该映射通过删除陈旧的条目来减少内存消耗。
   * 使用示例：此覆盖将使地图最多可以容纳100个条目，然后每次添加新条目时都会删除最旧的条目，从而保持100个条目的稳定状态。
   * private static final int MAX_ENTRIES = 100;
   * <p>
   * protected boolean removeEldestEntry(Map.Entry eldest) {
   * return size() > MAX_ENTRIES;
   * }
   * <p>
   * 此方法通常不以任何方式修改映射，而是允许映射按照其返回值的指示修改自身。 它允许这个方法直接修改地图，但如果这样做的话，它必须返回false（表示该映射不应试图进一步修改）。 在此方法中修改地图后返回true的效果未指定。
   * 此实现仅返回false （因此，此映射的行为类似于普通映射-永远不会删除最老的元素）。
   */
  @Override
  protected boolean removeEldestEntry(Entry<K, V> eldest) {
    return super.size() > capacity;
  }


  public static void main(String[] args) {
    final LruSimpleOne<String, String> lruSimpleOne = new LruSimpleOne<String, String>(3);
    lruSimpleOne.add("1", "1");
    lruSimpleOne.add("2", "2");
    lruSimpleOne.add("3", "3");
    lruSimpleOne.add("4", "4");
    final String s = lruSimpleOne.get("2");
    lruSimpleOne.add("5", "5");
    System.out.println(lruSimpleOne.keySet());
  }

}
